<?php

namespace Sisesporte\Service;

use Doctrine\ORM\EntityManager;
use Zend\Validator\File\Size;
use Zend\Http\PhpEnvironment\Request;
use Sisesporte\Utils\Email;

class AlunoService extends AbstractService
{

    protected $entity;

    public function __construct (EntityManager $em)
    {
        parent::__construct($em);
        $this->entity = 'Sisesporte\Entity\Aluno';
        $this->entityNew = 'Sisesporte\Entity\AlunoNew';
        date_default_timezone_set('America/Sao_Paulo');
    }

    public function insert (array $data)
    {
        $utils = new \Sisesporte\Utils\Utils();
        $email = new Email();

        // Persiste Pessoa
        $entityPessoa = new \Sisesporte\Entity\Pessoa();
        $sqUfOrgExpedidor = $this->em->getReference('Sisesporte\Entity\Uf', $data['sqUfOrgExpedidor']);
        $sqOrgaoExpIdentidade = $this->em->getReference('Sisesporte\Entity\OrgaoExpedidor', $data['sqOrgaoExpIdentidade']);
        $sqUfDadosPessoais = $this->em->getReference('Sisesporte\Entity\Uf', $data['sqUfDadosPessoais']);
        $sqCidadeDadosPessoais = $this->em->getReference('Sisesporte\Entity\Cidade', $data['sqCidadeDadosPessoais']);
        $sqGrauEscolaridade = $this->em->getReference('Sisesporte\Entity\GrauEscolaridade', $data['sqGrauEscolaridade']);
        $sqEstadoCivil = $this->em->getReference('Sisesporte\Entity\EstadoCivil', $data['sqEstadoCivil']);
        $sqPais = $this->em->getReference('Sisesporte\Entity\Pais', "1");

        $dataCadastro = (string) date("d/m/Y");
        $entityPessoa
                ->setNoPessoa($data['noPessoa'])
                ->setDtNascimento($data['dtNascimento'])
                ->setNuCpf($utils->formatarCpfCnpj($data['nuCpf'], FALSE))
                ->setNuCertidaoNascimento($data['nuCertidaoNascimento'])
                ->setNuIdentidade($data['nuIdentidade'])
                ->setSqUfOrgExpedidor($sqUfOrgExpedidor)
                ->setSqOrgaoExpIdentidade($sqOrgaoExpIdentidade)
                ->setInSexo($data['inSexo'])
                ->setSqUfNaturalidade($sqUfDadosPessoais)
                ->setSqCidadeNaturalidade($sqCidadeDadosPessoais)
                ->setNoMae($data['noMae'])
                ->setNoPai($data['noPai'])
                ->setNoEmail($data['noEmail'])
                ->setSqGrauEscolaridade($sqGrauEscolaridade)
                ->setSqEstadoCivil($sqEstadoCivil)
                ->setSqNacionalidade($sqPais)
                ->setDtCadastro($dataCadastro)
                ->setStAtivo('TRUE')
                ->setInTipoPessoa('A');
        $this->em->persist($entityPessoa);
        $this->em->flush();
        // Fim Persiste Pessoa
        // Aluno
        $dataInscricao = (string) date("d/m/Y");
        $entityAluno = new \Sisesporte\Entity\AlunoNew();
        $entityAluno->setSqPessoa($entityPessoa->getSqPessoa());
        $entityAluno->setInEstuda($data['inEstuda']);
        $entityAluno->setInTrabalha($data['inTrabalha']);
        $entityAluno->setSqProfissao($data['sqProfissao']);
        $entityAluno->setSqRendaFamiliar($data['sqRendaFamiliar']);
        $entityAluno->setInPlanoSaude($data['inPlanoSaude']);
        $entityAluno->setSqPlanoSaude($data['sqPlanoSaude']);
        $entityAluno->setSqTipoSanguineo($data['sqTipoSanguineo']);
        $entityAluno->setInPortadorNecessidade($data['inPortadorNecessidade']);
        $entityAluno->setInPossuiAlergia($data['inPossuiAlergia']);
        $entityAluno->setDeAlergia($data['deAlergia']);
        $entityAluno->setInRemedioControlado($data['inRemedioControlado']);
        $entityAluno->setDtInscricao($dataInscricao);
        $entityAluno->setStAtivo('TRUE');

        if (strlen($entityPessoa->getSqPessoa()) < 5) {
            $qtd = 5 - strlen($entityPessoa->getSqPessoa());
            $sq = $entityPessoa->getSqPessoa();
            for ($i = 0; $i < $qtd; $i++) {
                $sq = "0" . $sq;
            }
        } else {
            $sq = $entityPessoa->getSqPessoa();
        }
        $nuInscricao = date('Y') . $sq;
        $entityAluno->setCoCadastro($nuInscricao);

//        Validação
//        if (!empty($data['sqProfissao'])) {
//            $sqProfissao = $this->em->getReference('Sisesporte\Entity\Profissao', $data['sqProfissao']);
//            $entityAluno->setSqProfissao($sqProfissao);
//        } else {
//            $sqProfissao = $this->em->getReference('Sisesporte\Entity\Profissao', 96);
//            $entityAluno->setSqProfissao($sqProfissao->getSqProfissao());
//        }
//        if (!empty($data['sqPlanoSaude'])) {
//            $sqPlanoSaude = $this->em->getReference('Sisesporte\Entity\PlanoSaude', $data['sqPlanoSaude']);
//            $entityAluno->setSqPlanoSaude($sqPlanoSaude);
//        } else {
//            $entityAluno->setSqPlanoSaude(NULL);
//        }
//        if (!empty($data['sqTipoSanguineo'])) {
//            $sqTipoSanguineo = $this->em->getReference('Sisesporte\Entity\TipoSanguineo', $data['sqTipoSanguineo']);
//            $entityAluno->setSqTipoSanguineo($sqTipoSanguineo->getSqTipoSanguineo());
//        } else {
//            $entityAluno->setSqTipoSanguineo(NULL);
//        }
//        if (!empty($data['noInstituicaoEnsino'])) {
//            $noInstituicaoEnsino = $this->em->getReference('Sisesporte\Entity\InstituicaoEnsino', $data['noInstituicaoEnsino']);
//            $entityAluno->setSqInstituicaoEnsino($noInstituicaoEnsino);
//        } else {
//            $entityAluno->setSqInstituicaoEnsino(NULL);
//        }
//        if (!empty($data['sqRendaFamiliar'])) {
//            $sqRendaFamiliar = $this->em->getReference('Sisesporte\Entity\RendaFamiliar', $data['sqRendaFamiliar']);
//            $entityAluno->setSqRendaFamiliar($sqRendaFamiliar);
//        } else {
//            $entityAluno->setSqRendaFamiliar(NULL);
//        }

        $this->em->persist($entityAluno);
        $this->em->flush();

        if (!empty($data['noImagem']['name'])) {
            $nome_foto = date('Y') . "_" . $sq;
            rename($_SERVER['DOCUMENT_ROOT'] . "/upload/foto/" . $data['noImagem']['name'], $_SERVER['DOCUMENT_ROOT'] . "/upload/foto/" . $nome_foto . ".jpg");

            $repoP = $this->em->getRepository("Sisesporte\Entity\Pessoa")->find($entityPessoa->getSqPessoa());
            $repoP->setTxCaminhoFoto("upload/foto/" . $nome_foto . ".jpg");
            $this->em->persist($repoP);
            $this->em->flush();
        }

        // Fim persiste Aluno

        $sqTipoTelefoneFixo = $this->em->getReference('Sisesporte\Entity\TipoTelefone', '1');
        $sqTipoTelefoneMovel = $this->em->getReference('Sisesporte\Entity\TipoTelefone', '4');

        $entityTelefoneF = new \Sisesporte\Entity\Telefone();
        $entityTelefoneF->setSqPessoa($entityPessoa);
        $entityTelefoneF->setNoTelefone($utils->retiraMaskTel($data['noTelefoneFixo']))
                ->setSqTipoTelefone($sqTipoTelefoneFixo); //Fixo
        $entityTelefoneF->setStAtivo(TRUE);
        $this->em->persist($entityTelefoneF);
        $this->em->flush();

        //Telefone Movel
        $entityTelefoneM = new \Sisesporte\Entity\Telefone();
        $entityTelefoneM->setSqPessoa($entityPessoa);
        $entityTelefoneM->setNoTelefone($utils->retiraMaskTel($data['noTelefoneMovel']))
                ->setSqTipoTelefone($sqTipoTelefoneMovel); //Celular
        $entityTelefoneM->setStAtivo(TRUE);
        $this->em->persist($entityTelefoneM);
        $this->em->flush();
        //Fim Telefone Movel

        $sqCidadeDadosContato = $this->em->getReference('Sisesporte\Entity\Cidade', $data['sqCidadeDadosContato']);
        $entityEndereco = new \Sisesporte\Entity\Endereco();

        $entityEndereco->setSqPessoa($entityPessoa);
        $entityEndereco->setNuCep($data['nuCep']);
        $entityEndereco->setNoEndereco($data['noEndereco']);
        $entityEndereco->setNoComplemento($data['noComplemento']);
        $entityEndereco->setNoBairro($data['noBairro']);
        $entityEndereco->setSqCidade($sqCidadeDadosContato);
//        $entityEndereco->setSqContato($sqContato);
        $entityEndereco->setStAtivo(TRUE);
        $this->em->persist($entityEndereco);
        $this->em->flush();
//        exit;
// Adiconando responsavel, se for diferente da mae e pai
        if ($data['noResponsavelR'] != '') {
            $entityContatoR = new \Sisesporte\Entity\Contato();

            $sqParentescoR = $this->em->getReference('Sisesporte\Entity\Parentesco', $data['sqParentescoR']);

            $entityContatoR->setSqPessoa($entityPessoa);
            $entityContatoR->setNoContato($data['noResponsavelR']);
            $entityContatoR->setNoTelefone($utils->retiraMaskTel($data['noTelefoneR']));
            $entityContatoR->setStTipoContato('R'); //R-responsavel, E-emergencia
            $entityContatoR->setSqParentesco($sqParentescoR->getSqParentesco()); // 1 = Pai
            $entityContatoR->setStAtivo(TRUE);
            $this->em->persist($entityContatoR);
            $this->em->flush();
        }
        //// Fim Contato Pai

        $sqParentesco1 = $this->em->getReference('Sisesporte\Entity\Parentesco', '1');
        $sqParentesco2 = $this->em->getReference('Sisesporte\Entity\Parentesco', '2');
        $entityContatoP = new \Sisesporte\Entity\Contato();
        $entityContatoP->setSqPessoa($entityPessoa);
        $entityContatoP->setNoContato($data['noPai']);
        $entityContatoP->setNoTelefone($utils->retiraMaskTel($data['noTelefonePai']));
        $entityContatoP->setStTipoContato('C'); //R-responsavel, E-emergencia
        $entityContatoP->setSqParentesco($sqParentesco1);
        $entityContatoP->setStAtivo(TRUE);
        $this->em->persist($entityContatoP);
        $this->em->flush();

        $entityContatoE = new \Sisesporte\Entity\Contato();
        $entityContatoE->setSqPessoa($entityPessoa);
        $entityContatoE->setNoContato($data['noMae']);
        $entityContatoE->setNoTelefone($utils->retiraMaskTel($data['noTelefoneMae']));
        $entityContatoE->setStTipoContato('C'); //R-responsavel, E-emergencia
        $entityContatoE->setSqParentesco($sqParentesco2);
        $entityContatoE->setStAtivo(TRUE);
        $this->em->persist($entityContatoE);
        $this->em->flush();

        $repoC = $this->em->getRepository("Sisesporte\Entity\Contato");
        $entityContato = $repoC->findby(array('sqPessoa' => $entityPessoa->getSqPessoa(), 'sqParentesco' => $data['sqParentesco']), NULL);
        $entityContato[0]->setStTipoContato('E');
        $this->em->persist($entityContato[0]);
        $this->em->flush();

        $senha = $utils->gerarSenha();

        $entityAutenticacao = new \Sisesporte\Entity\Autenticacao();
        $entityAutenticacao->setSqPessoa($entityPessoa->getSqPessoa());
        $entityAutenticacao->setNoLogin($entityAluno->getCoCadastro())
                ->setNoSenha(md5($senha))
                ->setDtCadastro($dataInscricao)
                ->setInPrimeiroAcesso(TRUE)
                ->setStAtivo(TRUE);
        $this->em->persist($entityAutenticacao);
        $this->em->flush();

        $entityAutenticacaoPerfil = new \Sisesporte\Entity\AutenticacaoPerfil();
        $entityAutenticacaoPerfil->setSqPessoa($entityAluno->getSqPessoa());
        $entityAutenticacaoPerfil->setSqPerfilAcesso('1')
                ->setStAtivo(TRUE);
        $this->em->persist($entityAutenticacaoPerfil);
        $this->em->flush();

        $html = "<p>Prezado(a) Aluno(a) <strong>{$entityPessoa->getNoPessoa()}</strong>,<br />
                            Seu cadastro foi realizado com sucesso!<br />
                            Utilize o link e informações de acesso abaixo: <a href='http://test.sisesporte.secesportes.confidereit.com/'>http://www.escola.esporte.df.gov.br/admin/</a><br />
                            <strong>Matrícula: </strong>{$entityAutenticacao->getNoLogin()}<br />
                            <strong>Senha: </strong>{$senha}<br /><br />
                            Atenciosamente,<br />
                            <strong>Secretaria de Esportes</strong>                            
                        </p>";
        $subject = "SisEsporte | Cadastro Realizado no Sesp/DF";

        $email->sendEmail(
                array($entityPessoa->getNoEmail() => $entityPessoa->getNoPessoa()), $subject, $html
        );

        return $entityPessoa->getSqPessoa();
    }

    public function update ($id, array $data)
    {
        $utils = new \Sisesporte\Utils\Utils();
        $date = new \DateTime(date('Y-m-d'));

        $repoP = $this->em->getRepository("Sisesporte\Entity\Pessoa")->find($id);
        $entityPessoa = $repoP;

        $sqUfOrgExpedidor = $this->em->getReference('Sisesporte\Entity\Uf', $data['sqUfOrgExpedidor']);
        $sqOrgaoExpIdentidade = $this->em->getReference('Sisesporte\Entity\OrgaoExpedidor', $data['sqOrgaoExpIdentidade']);
        $sqUfDadosPessoais = $this->em->getReference('Sisesporte\Entity\Uf', $data['sqUfDadosPessoais']);
        $sqCidadeDadosPessoais = $this->em->getReference('Sisesporte\Entity\Cidade', $data['sqCidadeDadosPessoais']);
        $sqGrauEscolaridade = $this->em->getReference('Sisesporte\Entity\GrauEscolaridade', $data['sqGrauEscolaridade']);
        $sqEstadoCivil = $this->em->getReference('Sisesporte\Entity\EstadoCivil', $data['sqEstadoCivil']);
        $sqPais = $this->em->getReference('Sisesporte\Entity\Pais', "1");

        $entityPessoa
                ->setNoPessoa($data['noPessoa'])
//                ->setTxCaminhoFoto($data['txCaminhoFoto'])
                ->setDtNascimento($data['dtNascimento'])
                ->setNuCpf($utils->formatarCpfCnpj($data['nuCpf'], FALSE))
                ->setNuCertidaoNascimento($data['nuCertidaoNascimento'])
                ->setNuIdentidade($data['nuIdentidade'])
                ->setSqUfOrgExpedidor($sqUfOrgExpedidor)
                ->setSqOrgaoExpIdentidade($sqOrgaoExpIdentidade)
                ->setInSexo($data['inSexo'])
                ->setSqUfNaturalidade($sqUfDadosPessoais)
                ->setSqCidadeNaturalidade($sqCidadeDadosPessoais)
                ->setNoMae($data['noMae'])
                ->setNoPai($data['noPai'])
                ->setNoEmail($data['noEmail'])
                ->setSqGrauEscolaridade($sqGrauEscolaridade)
                ->setSqEstadoCivil($sqEstadoCivil)
                ->setSqNacionalidade($sqPais)
                ->setStAtivo('TRUE');
        $this->em->persist($entityPessoa);
        $this->em->flush();

        $repoA = $this->em->getRepository("Sisesporte\Entity\Aluno");
        $entityAluno = $repoA->find($id);

        $noInstituicaoEnsino = $this->em->getReference('Sisesporte\Entity\InstituicaoEnsino', $data['noInstituicaoEnsino']);
        $sqProfissao = $this->em->getReference('Sisesporte\Entity\Profissao', $data['sqProfissao']);
        $sqRendaFamiliar = $this->em->getReference('Sisesporte\Entity\RendaFamiliar', $data['sqRendaFamiliar']);
        $sqPlanoSaude = $this->em->getReference('Sisesporte\Entity\PlanoSaude', $data['sqPlanoSaude']);
        $sqTipoSanguineo = $this->em->getReference('Sisesporte\Entity\TipoSanguineo', $data['sqTipoSanguineo']);

        $entityAluno->setInEstuda($data['inEstuda'])
                ->setSqInstituicaoEnsino($noInstituicaoEnsino)
                ->setInTrabalha($data['inTrabalha'])
                ->setSqProfissao($sqProfissao)
                ->setSqRendaFamiliar($sqRendaFamiliar)
                ->setInPlanoSaude($data['inPlanoSaude'])
                ->setSqPlanoSaude($sqPlanoSaude)
                ->setSqTipoSanguineo($sqTipoSanguineo)
                ->setInPortadorNecessidade($data['inPortadorNecessidade'])
                ->setInPossuiAlergia($data['inPossuiAlergia'])
                ->setDeAlergia($data['deAlergia'])
                ->setInRemedioControlado($data['inRemedioControlado'])
                ->setDtInscricao($date)
                ->setStAtivo('TRUE');
        if (strlen($entityPessoa->getSqPessoa()) < 5) {
            $qtd = 5 - strlen($entityPessoa->getSqPessoa());
            $sq = $entityPessoa->getSqPessoa();
            for ($i = 0; $i < $qtd; $i++) {
                $sq = "0" . $sq;
            }
        } else {
            $sq = $entityPessoa->getSqPessoa();
        }
        $nuInscricao = date('Y') . $sq;
        $entityAluno->setCoCadastro($nuInscricao);
        $this->em->persist($entityAluno);
        $this->em->flush();
        
         if (!empty($data['noImagem']['name'])) {
             
            $nome_foto = date('Y') . "_" . $sq;
            
            rename('public/upload/foto/' . $data['noImagem']['name'], "public/upload/foto/" . $nome_foto . ".jpg");

            $repoP = $this->em->getRepository("Sisesporte\Entity\Pessoa")->find($entityPessoa->getSqPessoa());
            $repoP->setTxCaminhoFoto("upload/foto/" . $nome_foto . ".jpg");
            $this->em->persist($repoP);
            $this->em->flush();
        }

        $repoT = $this->em->getRepository("Sisesporte\Entity\Telefone");
        $entityTelefoneF = $repoT->findby(array('sqPessoa' => $id, 'sqTipoTelefone' => '1'), NULL);
        $entityTelefoneF[0]->setNoTelefone($utils->retiraMaskTel($data['noTelefoneFixo']));
        $entityTelefoneF[0]->setStAtivo(TRUE);
        $this->em->persist($entityTelefoneF[0]);
        $this->em->flush();

        //Telefone Movel
        $repoT = $this->em->getRepository("Sisesporte\Entity\Telefone");
        $entityTelefoneM = $repoT->findby(array('sqPessoa' => $id, 'sqTipoTelefone' => '4'), NULL);
        $entityTelefoneM[0]->setNoTelefone($utils->retiraMaskTel($data['noTelefoneMovel']));
        $entityTelefoneM[0]->setStAtivo(TRUE);
        $this->em->persist($entityTelefoneM[0]);
        $this->em->flush();
        //Fim Telefone Movel

        $repoE = $this->em->getRepository("Sisesporte\Entity\Endereco");

        $sqCidadeDadosContato = $this->em->getReference('Sisesporte\Entity\Cidade', $data['sqCidadeDadosContato']);

        $entityEndereco = $repoE->findby(array('sqPessoa' => $id), NULL);
        $entityEndereco[0]->setNuCep($data['nuCep']);
        $entityEndereco[0]->setNoEndereco($data['noEndereco']);
        $entityEndereco[0]->setNoComplemento($data['noComplemento']);
        $entityEndereco[0]->setNoBairro($data['noBairro']);
        $entityEndereco[0]->setSqCidade($sqCidadeDadosContato);
        $entityEndereco[0]->setStAtivo(TRUE);
        $this->em->persist($entityEndereco[0]);
        $this->em->flush();

        $repoC = $this->em->getRepository("Sisesporte\Entity\Contato");
        $entityContatoPai = $repoC->findBy(array('sqPessoa' => $id, 'sqParentesco' => '1'));
        $entityContatoPai[0]->setNoContato($data['noPai'])
                ->setNoTelefone($utils->retiraMaskTel($data['noTelefonePai']));
        $this->em->persist($entityContatoPai[0]);
        $this->em->flush();

        $repoC = $this->em->getRepository("Sisesporte\Entity\Contato");
        $entityContatoMae = $repoC->findBy(array('sqPessoa' => $id, 'sqParentesco' => '2'));
        $entityContatoMae[0]->setNoContato($data['noMae'])
                ->setNoTelefone($utils->retiraMaskTel($data['noTelefoneMae']));
        $this->em->persist($entityContatoMae[0]);
        $this->em->flush();

        if ($data['noResponsavelR'] != '') {

            $sqParentescoR = $this->em->getReference('Sisesporte\Entity\Parentesco', $data['sqParentescoR']);
            $repoC = $this->em->getRepository("Sisesporte\Entity\Contato");
            $entityContatoR = $repoC->findBy(array('sqPessoa' => $id, 'sqParentesco' => $sqParentescoR));
            $entityContatoR[0]->setNoContato($data['noResponsavelR'])
                    ->setNoTelefone($utils->retiraMaskTel($data['noTelefoneR']));
            $this->em->persist($entityContatoR[0]);
            $this->em->flush();
        }

        return $entityPessoa->getSqPessoa();
    }

}
